package com.dmjj.common.fileload;

import com.dmjj.common.result.configCode;
import org.apache.commons.codec.binary.Base64;
import org.springframework.mock.web.MockMultipartFile;
import org.springframework.web.multipart.MultipartFile;

import javax.servlet.http.HttpServletResponse;
import java.io.*;
import java.util.HashMap;
import java.util.Map;

/**
 * @author 王丽凯
 * @Description: TODO
 * @Title: Fileload
 * @ProjectName common
 * @date 2018/12/19
 */
public class Fileload {

    /**
     * @Description: 上传文件
     * @param type 为0的时候是 文件， 1的时候图片
     * @return map 中包含路径
     * @author 王丽凯
     * @date 2018/12/19
     */
    public static Map<String, Object> upload(int type, MultipartFile file){

        Map<String, Object> map = new HashMap<>();

        String filetype = type==0?"file":"img";

        try {
            //2.根据时间戳创建新的文件名，这样即便是第二次上传相同名称的文件，也不会把第一次的文件覆盖了
            String fileName = System.currentTimeMillis() + file.getOriginalFilename();
            // 得到上传文件的扩展名
            String oldFileName = file.getName()!=null&&file.getName()!=""?file.getName():file.getOriginalFilename();
            String fileExt = oldFileName.substring(oldFileName.lastIndexOf(".") + 1).toLowerCase();
            //3.通过req.getServletContext().getRealPath("") 获取当前项目的真实路径，然后拼接前面的文件名
            String destFileName = "D://" + "uploaded/"  + filetype + "/" + fileName + "." + fileExt;
            //4.第一次运行的时候，这个文件所在的目录往往是不存在的，这里需要创建一下目录（创建到了webapp下uploaded文件夹下）
            File destFile = new File(destFileName);
            //判断是否存在
            if (destFile.exists()){
                return configCode.ResultTemplate(configCode.code_1025,destFileName);
            }else {
                destFile.getParentFile().mkdirs();
                //5.把浏览器上传的文件复制到希望的位置
                file.transferTo(destFile);
                return configCode.ResultTemplate(configCode.code_1029,destFileName);
            }
        } catch (FileNotFoundException e) {
            e.printStackTrace();
            return configCode.ResultTemplate(configCode.code_1030,null);
        } catch (IOException e) {
            e.printStackTrace();
            return configCode.ResultTemplate(configCode.code_1030,null);
        }

    }

    /**
     * @Description: 下载文件
     * @param filePath 文件路径 fileName
     * @return  
     * @author 王丽凯
     * @date 2018/12/19
     */
    public static Map<String, Object> download(HttpServletResponse response, String filePath, String fileName){

        try{
            InputStream in = null;
            byte[] data = null;
            //读取图片字节数组
            in = new FileInputStream(filePath);
            String imgeBase = null;
            BufferedInputStream bis = new BufferedInputStream(in);
            // 清空response
            response.reset();
            // 文件名称转换编码格式为utf-8,保证不出现乱码,这个文件名称用于浏览器的下载框中自动显示的文件名
            response.addHeader("Content-Disposition", "attachment;filename="
                    + new String(fileName.getBytes("utf-8"), "iso8859-1"));
            //response.addHeader("Content-Length", "" + filesize);
            BufferedOutputStream os = new BufferedOutputStream(
                    response.getOutputStream());
            response.setContentType("application/octet-stream");
            // 从输入流中读入字节流，然后写到文件中
            byte[] buffer = new byte[1024];
            int nRead;
            while ((nRead = bis.read(buffer, 0, 1024)) > 0) { // bis为网络输入流
                os.write(buffer, 0, nRead);
            }
            bis.close();
            os.flush();
            os.close();
            return configCode.ResultTemplate(configCode.code_1001,imgeBase);
        }catch (IOException e){
            e.printStackTrace();
            return configCode.ResultTemplate(configCode.code_1031,null);
        }

    }

    /**
     * @Description: 图片转64
     * @param  filePath 图片路径
     * @return map 包含64 字符串
     * @author 王丽凯
     * @date 2018/12/19
     */
    public static Map<String, Object> toImgeBase64(String filePath){
        try {
            InputStream in = null;
            byte[] data = null;
            //读取图片字节数组
            in = new FileInputStream(filePath);
            String imgeBase = null;
            data = new byte[in.available()];
            in.read(data);
            in.close();
            imgeBase = new String(Base64.encodeBase64(data));
            return configCode.ResultTemplate(configCode.code_1001,imgeBase);
        }catch (Exception e){
            e.printStackTrace();
            return configCode.ResultTemplate(configCode.code_1018,null);
        }
    }

    public static void main(String[] args) {
        //File pdfFile = new File("C://Users/dongming/Desktop/1011.png");
        try {
            File pdfFile = new File("C://Users/dongming/Desktop/1011.jpg");
            FileInputStream fileInputStream = new FileInputStream(pdfFile);
            MultipartFile multipartFile = new MockMultipartFile(pdfFile.getName(), fileInputStream);
            System.out.println(upload(1,multipartFile));
            //System.out.println(toImgeBase64("D://uploaded/img/1545211080332.jpg"));
        }catch (Exception e){
            e.printStackTrace();
        }
    }

    public static boolean delete(String fileName) {
        File file = new File(fileName);
        if (!file.exists()) {
            System.out.println("删除文件失败:" + fileName + "不存在！");
            return false;
        } else {
            if (file.isFile())
                return deleteFile(fileName);
            else
                return deleteDirectory(fileName);
        }
    }

    /**
     * 删除单个文件
     *
     * @param fileName
     *            要删除的文件的文件名
     * @return 单个文件删除成功返回true，否则返回false
     */
    public static boolean deleteFile(String fileName) {
        File file = new File(fileName);
        // 如果文件路径所对应的文件存在，并且是一个文件，则直接删除
        if (file.exists() && file.isFile()) {
            if (file.delete()) {
                System.out.println("删除单个文件" + fileName + "成功！");
                return true;
            } else {
                System.out.println("删除单个文件" + fileName + "失败！");
                return false;
            }
        } else {
            System.out.println("删除单个文件失败：" + fileName + "不存在！");
            return false;
        }
    }

    /**
     * 删除目录及目录下的文件
     *
     * @param dir
     *            要删除的目录的文件路径
     * @return 目录删除成功返回true，否则返回false
     */
    public static boolean deleteDirectory(String dir) {
        // 如果dir不以文件分隔符结尾，自动添加文件分隔符
        if (!dir.endsWith(File.separator))
            dir = dir + File.separator;
        File dirFile = new File(dir);
        // 如果dir对应的文件不存在，或者不是一个目录，则退出
        if ((!dirFile.exists()) || (!dirFile.isDirectory())) {
            System.out.println("删除目录失败：" + dir + "不存在！");
            return false;
        }
        boolean flag = true;
        // 删除文件夹中的所有文件包括子目录
        File[] files = dirFile.listFiles();
        for (int i = 0; i < files.length; i++) {
            // 删除子文件
            if (files[i].isFile()) {
                flag = Fileload.deleteFile(files[i].getAbsolutePath());
                if (!flag)
                    break;
            }
            // 删除子目录
            else if (files[i].isDirectory()) {
                flag = Fileload.deleteDirectory(files[i]
                        .getAbsolutePath());
                if (!flag)
                    break;
            }
        }
        if (!flag) {
            System.out.println("删除目录失败！");
            return false;
        }
        // 删除当前目录
        if (dirFile.delete()) {
            System.out.println("删除目录" + dir + "成功！");
            return true;
        } else {
            return false;
        }
    }
}
